SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO


CREATE PROCEDURE [dbo].[LIQAguinaldoDiferencia]
@Agente INT,
@Servicio INT,
@Plaza INT,
@Resultado DECIMAL OUTPUT,
@idLiquidacion INT,
@DiasALiquidar INT, 
@DiasDelPeriodo INT,
@Desde DATETIME,
@Hasta DATETIME
 AS 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- REGISTRO DE ACTUALIZACIONES
-- 09/07/2006 - Los parametros se obtienen de la funcion fnObtenerValorDeParametro con la fecha que corresponda.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET NOCOUNT ON

SET DATEFORMAT DMY

-- Si el servicio es suplente comun.
IF EXISTS(SELECT * FROM tb_ServiciosAgentes WHERE SituacionRevista = 4 AND IdServicioAgente = @Servicio)
BEGIN

	DECLARE @MaximoHaber DECIMAL(18,4), @DescuentoBancario DECIMAL(18,4), @SAC DECIMAL(18,4)
	DECLARE @Remunerativo DECIMAL(18,4), @Presentismo DECIMAL(18,4)
	DECLARE @TotalRemunerativo DECIMAL(18,4)
	DECLARE @Afiliacion INT, @horas INT, @regimensalarial  INT, @organizacion INT,@situacionrevista INT
	DECLARE @DescAporte DECIMAL(18,4)
	DECLARE @NroError INT
	DECLARE @SubOrganizacion INT
	DECLARE @Cabecera INT
	DECLARE @TotalRemunerativoMesActual DECIMAL(18,4)

	DECLARE @FechaAlta DATETIME, @FechaBaja DATETIME
	DECLARE @TotalDiasSinGoce INT
	DECLARE @TotalDiasTrabajados INT
	DECLARE @SueldoBasico DECIMAL(18,4)
	DECLARE @CabeceraDeLiquidacion INT 
	DECLARE @FechaDesde DATETIME, @FechaHasta DATETIME
	DECLARE @CantidadDeAguinaldos DECIMAL(18,2)
	DECLARE @MesesDeAguinaldo INT
	DECLARE @DiasDeAguinaldo INT 
	DECLARE @AuxAguinaldoDesde VARCHAR(10), @AguinaldoDesde DATETIME, @AguinaldoHasta DATETIME
	DECLARE @FechaHastaRealAguinaldo DATETIME
	DECLARE @PreAguinaldo DECIMAL(18,4)
	--Donde vamos a calcular la diferencia.
	DECLARE @AguinaldoDefinitivo DECIMAL(18,4)

	SELECT @SueldoBasico = MontoHaberes FROM tb_RegistroDeLiquidaciones WHERE Concepto = 4 And Servicio = @Servicio And Liquidacion = @idLiquidacion
	SELECT @Presentismo = 0, @Remunerativo = 0


	--SELECT @CantidadDeAguinaldos = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro = 'CantidadDeAguinaldosAPagar'
	--SELECT @MesesDeAguinaldo = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'MesesDeAguinaldo'

	SELECT @CantidadDeAguinaldos = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('CantidadDeAguinaldosAPagar', @Hasta))
	SELECT @MesesDeAguinaldo = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('MesesDeAguinaldo', @Hasta))

	SELECT @Cabecera =  IdCabeceraLiquidacion FROM tb_Liquidaciones WHERE IdLiquidacion = @IdLiquidacion
	SELECT @FechaHastaRealAguinaldo = HastaSuplente FROM tb_CabeceraDeLiquidacion WHERE IdCabeceraDeLiquidacion = @Cabecera
	
	--Aguinaldo calculado el mes anterior calculado a 5 meses
	SELECT @PreAguinaldo = MontoHaberes FROM tb_RegistroDeLiquidaciones R
		INNER JOIN tb_Liquidaciones L ON R.Liquidacion = L.IdLiquidacion
		INNER JOIN tb_CabeceraDeLiquidacion C ON C.IdCabeceraDeLiquidacion = L.IdCabeceraLiquidacion
	WHERE C.DesdeSuplente = DATEADD(MONTH, -1, @Desde)
	AND C.TipoDeLiquidacion = 4 -- Que sea definitiva
	AND R.Concepto = 32
	AND R.Servicio = @Servicio

	SELECT @TotalRemunerativoMesActual = SUM(MontoHaberes)  FROM tb_RegistroDeLiquidaciones, tb_ConceptosDeLiquidacion 
		 WHERE Servicio = @Servicio and liquidacion = @idLiquidacion and concepto = idConceptoLiquidacion and ((tipo = 1 or tipo = 2) OR (Concepto=9))

	IF (@PreAguinaldo IS NULL)
		SELECT @PreAguinaldo = 0

	SELECT @AguinaldoHasta = @Hasta

	-- Para armar la FECHA DESDE EL AGUINALDO
	IF MONTH(@AguinaldoHasta) > @MesesDeAguinaldo
		SELECT @AuxAguinaldoDesde = '01/07/' + CONVERT(VARCHAR, YEAR(@AguinaldoHasta))
	ELSE
		SELECT @AuxAguinaldoDesde = '01/01/' + CONVERT(VARCHAR, YEAR(@AguinaldoHasta))

	SELECT @AguinaldoDesde = CONVERT(DATETIME, @AuxAguinaldoDesde)

	SELECT @TotalDiasSinGoce=0, @TotalDiasTrabajados = 0

	SELECT @DiasDeAguinaldo = DATEDIFF(DAY, @AguinaldoDesde, @FechaHastaRealAguinaldo) + 1

	-- Se obtiene el Máximo Remunerativo con Aporte y el presentismo para ese mes.
	--SELECT @Remunerativo = MAX(R.MontoHaberes+ISNULL(R2.MontoHaberes,0.0)) 
	--	FROM tb_RegistroDeLiquidaciones R, tb_RegistroDeLiquidaciones R2, tb_Liquidaciones L, tb_RegistroDeLiquidaciones R3 
	--	WHERE idLiquidacion = R.Liquidacion
	--		And R.Concepto = 16 And L.Desde >= @AguinaldoDesde And L.Hasta <= @AguinaldoHasta
	--		And R.Agente = @Agente And R.Servicio = @Servicio And R2.Servicio = R.Servicio
	--		And R.Liquidacion = R2.Liquidacion And R2.Concepto = 9 
	--		AND L.Tipo = 4 
	--		AND R3.Liquidacion = R.Liquidacion AND R3.Servicio = R.Servicio AND R3.Concepto = 29 AND R3.MontoHaberes < 32
			
	SELECT @Remunerativo = MAX(R.MontoHaberes+ISNULL(R2.MontoHaberes,0.0)-ISNULL(R4.MontoHaberes, 0.0))
	FROM tb_Liquidaciones L
	INNER JOIN tb_RegistroDeLiquidaciones R ON R.Liquidacion = L.IdLiquidacion AND R.Concepto = 16
	INNER JOIN tb_RegistroDeLiquidaciones R2 ON R2.Liquidacion = L.IdLiquidacion AND R2.Concepto = 9
	INNER JOIN tb_RegistroDeLiquidaciones R3 ON R3.Liquidacion = L.IdLiquidacion AND R3.Concepto = 29
	LEFT OUTER JOIN tb_RegistroDeLiquidaciones R4 ON R4.Liquidacion = L.IdLiquidacion AND R4.Concepto = 32
	WHERE R.Servicio = R2.Servicio AND R2.Servicio = R3.Servicio AND R3.Servicio = R4.Servicio
	AND R3.MontoHaberes < 32
	AND L.Tipo = 4 AND L.Desde >= @AguinaldoDesde And L.Hasta <= @AguinaldoHasta
	AND R.servicio = @Servicio

	If @Remunerativo Is Null
		SELECT @Remunerativo = 0 
		--SELECT @Remunerativo = MAX(R.MontoHaberes)
		--FROM tb_RegistroDeLiquidaciones R,  tb_Liquidaciones L, tb_RegistroDeLiquidaciones R3 
		--WHERE idLiquidacion = R.Liquidacion
		--And R.Concepto = 16 And L.Desde >= @AguinaldoDesde And L.Hasta <= @AguinaldoHasta
		--And R.Agente = @Agente And R.Servicio = @Servicio
		--AND L.Tipo = 4
		--AND R3.Liquidacion = R.Liquidacion AND R3.Servicio = R.Servicio AND R3.Concepto = 29 AND R3.MontoHaberes < 32

	IF  @TotalRemunerativoMesActual > @Remunerativo
                      SELECT @Remunerativo = @TotalRemunerativoMesActual

	SELECT @MaximoHaber = @Remunerativo * @CantidadDeAguinaldos

	SELECT @TotalDiasTrabajados = DATEDIFF(DAY, FechaAlta, ISNULL(FechaBaja,@AguinaldoHasta))+1 FROM tb_ServiciosAgentes WHERE idServicioAgente = @Servicio

	DECLARE DiasSinGoce CURSOR FOR SELECT FechaAlta, FechaBaja FROM tb_SubServiciosAgentes
			WHERE ServicioAgente = @Servicio And SituacionLaboral = 4 And ((FechaBaja Is Null) or (FechaBaja >= @AguinaldoDesde))

	OPEN DiasSinGoce
	FETCH NEXT FROM DiasSinGoce INTO @FechaAlta, @FechaBaja

	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF @AguinaldoHasta < @FechaBaja Or @FechaBaja Is Null
			SELECT @FechaBaja = @AguinaldoHasta
		IF @FechaAlta < @AguinaldoDesde
			SELECT @TotalDiasSinGoce = @TotalDiasSinGoce + DATEDIFF(DAY, @AguinaldoDesde,@FechaBaja)+1
		ELSE
			SELECT @TotalDiasSinGoce = @TotalDiasSinGoce + DATEDIFF(DAY, @FechaAlta,@FechaBaja)+1	
		FETCH NEXT FROM DiasSinGoce INTO @FechaAlta, @FechaBaja
	END

	CLOSE DiasSinGoce
	DEALLOCATE DiasSinGoce

	If @TotalDiasTrabajados > @DiasDeAguinaldo
		SELECT @TotalDiasTrabajados = @DiasDeAguinaldo

	If @TotalDiasSinGoce > @DiasDeAguinaldo
		SELECT @TotalDiasSinGoce = @DiasDeAguinaldo

	SELECT @TotalDiasTrabajados = @TotalDiasTrabajados - @TotalDiasSinGoce

	SELECT @SAC = (@TotalDiasTrabajados * @MaximoHaber) / @DiasDeAguinaldo

	-- Se calcula el saldo.
	SELECT @AguinaldoDefinitivo = @SAC - @PreAguinaldo

	-- Si el saldo da negativo se deja en 0
	IF @AguinaldoDefinitivo < 0 
		SELECT @AguinaldoDefinitivo = 0

	SELECT @Afiliacion = idAfiliacion	 FROM tb_Afiliaciones WHERE idAgente = @Agente
	SELECT @horas= horas, @regimensalarial = regimensalarial, @SubOrganizacion = SubOrganizacion 
		FROM tb_Plazas WHERE idPlaza = @Plaza
	SELECT @Organizacion = ubicacionOrig, @SituacionRevista = SituacionRevista 
		FROM tb_ServiciosAgentes WHERE idservicioAgente =  @Servicio

	IF (SELECT OrganizacionLiquidadora FROM tb_SubOrganizaciones WHERE
	idSubOrganizacion = @SubOrganizacion) Is Not Null
		SELECT @Organizacion = OrganizacionLiquidadora FROM tb_SubOrganizaciones WHERE
	idSubOrganizacion = @SubOrganizacion

	If @AguinaldoDefinitivo > 0 
		INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
		VALUES (null, @Afiliacion, @Agente, null, 1, null, 32, null, null, null, null, null, null, @horas, 0, @idLiquidacion, 0, @AguinaldoDefinitivo, @Organizacion, null, @Servicio, @SituacionRevista, @diasALiquidar, @SubOrganizacion)

	SELECT @NroError = @@error

	IF @NroError <> 0
	BEGIN
		SELECT @CabeceraDeLiquidacion = IdCabeceraLiquidacion FROM tb_Liquidaciones WHERE IdLiquidacion = @IdLiquidacion

 		INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) 
		VALUES(@Agente, 32, convert(varchar,@NroError), getdate(), @idLiquidacion,@Organizacion, @Servicio, @CabeceraDeLiquidacion, @NroError)
	END
END
GO
